属性查询 Sample详情
最后更新时间:2020年12月8日
属性条件查询,即为属性关键字查询,根据选择图层、字段、关键字对图层要素进行查询并显示查询结果。通过结果要素可获取其空间信息与属性信息,根据应用需求解析结果,并选择适合的方式展现。属性查询与空间查询整体思路一致,大部分步骤也相同,主要区别在于属性查询不需要设置空间范围条件,需设置属性过滤条件。
1
与空间查询类似,首先需准备待查询的图层数据。
//获取地图对象 Map map = mapView.getMap(); //获取查询图层对象(指定点图层) for (int i = 0; i < map.getLayerCount(); i++) { mapLayer = map.getLayer(i); if (mapLayer.getName().equals("四级点")) { //获取矢量图层 vectorLayer = (VectorLayer) mapLayer; break; } }
2
创建查询条件对象(QueryDef),为其设置构造的查询属性条件等参数。
//属性查询条件(根据想要查询的字段、关键字、属性条件,构造查询语句,保存为字符串) if (condition != "") { condition = "Name LIKE '%公园%'"; } //初始化查询对象(矢量图层) FeatureQuery featureQuery = new FeatureQuery(vectorLayer); //设置查询条件 QueryDef queryDef = new QueryDef(); queryDef.setPagination(0, 10000);//设置分页查询 queryDef.setFilter(condition);//设置属性条件 queryDef.setWithSpatial(true);//是否设置缓存空间图形记录 queryDef.setSubFields("*");//属性相关选项设置,设置查询结果字段集 字段名支持以空格或者'\t'隔开,如a, b , c featureQuery.setQueryDef(queryDef);//设置查询条件对象
3
执行查询操作,并获取查询结果。
//进行查询 FeaturePagedResult result = featureQuery.query(); //查询结果要素个数 mFeatureCount = result.getTotalFeatureCount(); if (mFeatureCount != 0) { Toast.makeText(this, "查询结果个数为:" + mFeatureCount, Toast.LENGTH_SHORT).show(); //自定义方法:以标注形式展示查询的位置点 showResultFeatrue(result); } else { Toast.makeText(this, "查询不到符合条件的要素", Toast.LENGTH_SHORT).show(); }
4
解析查询返回的结果要素,可通过标注、列表等形式展示给用户。
//自定义方法:获取结果中的要素及其属性、几何,以标注形式展示查询的位置点 private void showResultFeatrue(FeaturePagedResult result) { //结果列表对象 ListView attObj = (ListView) findViewById(R.id.result); //结果列表数组 String[] fNameArr; //要素名称 String featureName = ""; //取第一页结果要素 featureList = result.getPage(1); //结果列表数组大小 fNameArr = new String[featureList.size()]; //获取地图容器对象 mapView = (MapView) findViewById(R.id.spatialquery_mapview); //遍历要素获取其属性信息与几何信息 for (int i = 0; i < featureList.size(); i++) { // 获取要素 Feature feature = featureList.get(i); // 获取要素属性 java.util.Mapattributes = new HashMap (); // 获取要素字段结构 Fields fields = result.getFields(); // 获取字段数目 short fieldCount = fields.getFieldCount(); for (short j = 0; j < fieldCount; j++) { Field field = fields.getField(j); // 获取字段名称 String strFieldName = field.getFieldName(); // 获取对应字段的值 attributes = feature.getAttributes(); // 显示获取到的属性信息 if (strFieldName.equals("Name")) { //结果列表数组 fNameArr[i] = attributes.get(strFieldName); //结果要素名称 featureName = attributes.get(strFieldName); } } //获取要素的几何信息(默认查询点要素) Geometry fGeometry = feature.getGeometry(); GeometryType featureType = fGeometry.getType(); if (featureType.equals(GeometryType.GeoPoint)) { //转换为点图形 GeoPoint geoPoint = (GeoPoint) fGeometry; Dot3D point3D = geoPoint.get(); point = new Dot(point3D.getX(), point3D.getY()); } else if (featureType.equals(GeometryType.GeoMultiPoint)) { //转换为点图形 GeoMultiPoint geoPoints = (GeoMultiPoint) fGeometry; //获取点图形的几何点 Dot3D point3D = geoPoints.get(0); point = new Dot(point3D.getX(), point3D.getY()); } //在地图上添加标注 addLabel(point, featureName); // 获取要素对应的图形 //List graphics = feature.toGraphics(true); // 高亮显示查询的结果 //mapView.getGraphicsOverlay().addGraphics(graphics); } //将结果列表数组包装成ArrayAdapter ArrayAdapter
adapter = new ArrayAdapter (this, R.layout.array_item, fNameArr); //为ListView设置Adapter attObj.setAdapter(adapter); //刷新地图 mapView.refresh(); } /** * 添加标注 * * @param dot */ private void addLabel(Dot dot, String name) { Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.location); mapView = (MapView) findViewById(R.id.spatialquery_mapview); AnnotationsOverlay annotationsOverlay = mapView.getAnnotationsOverlay(); Annotation annotation = new Annotation(name, name, dot, bmp); annotation.setCanShowAnnotationView(true); annotationsOverlay.addAnnotation(annotation); }
实现效果如下图所示: